home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / datacomm / xpr / xprkermit-1.111.lzh / libsup.c < prev    next >
C/C++ Source or Header  |  1991-03-19  |  3KB  |  131 lines

  1. /* libsup.c    -- exec library routines for XPR Kermit */
  2.  
  3. #include <exec/lists.h>
  4. #include <exec/resident.h>
  5. #include <functions.h>
  6. #include "xprkermit.h"
  7. #include "version.h"
  8.  
  9. /*lint -esym(530,XProtocolBase)        suppress "not initialized" for this */
  10.  
  11. void myInit(void);
  12. long myOpen(void);
  13. long myClose(void);
  14. long myExpunge(void);
  15.  
  16. #pragma amicall(XProtocolBase, 0x06, myOpen())
  17. #pragma amicall(XProtocolBase, 0x0c, myClose())
  18. #pragma amicall(XProtocolBase, 0x12, myExpunge())
  19.  
  20. /* library initialization table, used for AUTOINIT libraries            */
  21. struct InitTable {
  22.     unsigned long    it_DataSize;          /* library data space size        */
  23.     void            **it_FuncTable;          /* table of entry points            */
  24.     void             *it_DataInit;          /* table of data initializers        */
  25.     void            (*it_InitFunc)(void); /* initialization function to run    */
  26. };
  27.  
  28. void *libfunctab[] = {    /* my function table */
  29.     myOpen,                    /* standard open    */
  30.     myClose,                /* standard close    */
  31.     myExpunge,                /* standard expunge    */
  32.     0,
  33.  
  34.     /* ------    user UTILITIES */
  35.     XProtocolCleanup,
  36.     XProtocolSetup,
  37.     XProtocolSend,
  38.     XProtocolReceive,
  39.  
  40.     (void *)-1                /* end of function vector table */
  41. };
  42.  
  43. struct InitTable myInitTab =  {
  44.     sizeof (struct XProtocolBase),
  45.     libfunctab,
  46.     0,                        /* will initialize my data in funkymain()    */
  47.     myInit
  48. };
  49.  
  50. char myname[] = "xprkermit.library";
  51. char myid[] = "xprkermit " VSTRING " (" __DATE__ ")\r\n";
  52.  
  53. extern struct Resident    myRomTag;
  54.  
  55. long
  56. _main(struct XProtocolBase *XProtocolBase, unsigned long seglist)
  57. {
  58.     XProtocolBase->xp_SegList = seglist;
  59.  
  60.     /* ----- init. library structure  -----        */
  61.     XProtocolBase->xp_Lib.lib_Node.ln_Type = NT_LIBRARY;
  62.     XProtocolBase->xp_Lib.lib_Node.ln_Name = (char *) myname;    
  63.     XProtocolBase->xp_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
  64.     XProtocolBase->xp_Lib.lib_Version = myRomTag.rt_Version;
  65.     XProtocolBase->xp_Lib.lib_Revision = REVISION;
  66.     XProtocolBase->xp_Lib.lib_IdString = (APTR) myid;
  67.     return 0;
  68. }
  69.  
  70. long myOpen(void)
  71. {
  72.     struct XProtocolBase *XProtocolBase;
  73. /*
  74.  * We are (should be :-) Re-entrant!
  75.  */
  76.     /* mark us as having another customer                */
  77.     XProtocolBase->xp_Lib.lib_OpenCnt++;
  78.  
  79.     /* prevent delayed expunges (standard procedure)        */
  80.     XProtocolBase->xp_Lib.lib_Flags &= ~LIBF_DELEXP;
  81.  
  82.     return ((long) XProtocolBase);
  83. }
  84.  
  85. long
  86. myClose(void)
  87. {
  88.     struct XProtocolBase *XProtocolBase;
  89.     long retval = 0;
  90.  
  91.     if (--XProtocolBase->xp_Lib.lib_OpenCnt == 0) {
  92.  
  93.         if  (XProtocolBase->xp_Lib.lib_Flags & LIBF_DELEXP) {
  94.             /* no more people have me open,
  95.              * and I have a delayed expunge pending
  96.              */
  97.             retval = myExpunge(); /* return segment list    */
  98.         }
  99.     }
  100.  
  101.     return (retval);
  102. }
  103.  
  104. long myExpunge(void)
  105.  
  106. {
  107.     struct XProtocolBase *XProtocolBase;
  108.     unsigned long seglist = 0;
  109.     long libsize;
  110.     extern struct Library *DOSBase;
  111.  
  112.     if (XProtocolBase->xp_Lib.lib_OpenCnt == 0) {
  113.         /* really expunge: remove libbase and freemem    */
  114.  
  115.         seglist    = XProtocolBase->xp_SegList;
  116.  
  117.         Remove(&XProtocolBase->xp_Lib.lib_Node);
  118.                                 /* i'm no longer an installed library    */
  119.  
  120.         libsize = XProtocolBase->xp_Lib.lib_NegSize+XProtocolBase->xp_Lib.lib_PosSize;
  121.         FreeMem((char *)XProtocolBase-XProtocolBase->xp_Lib.lib_NegSize, libsize);
  122.         CloseLibrary(DOSBase);        /* keep the counts even */
  123.     }
  124.     else
  125.         XProtocolBase->xp_Lib.lib_Flags |= LIBF_DELEXP;
  126.  
  127.     /* return NULL or real seglist                */
  128.     return ((long) seglist);
  129. }
  130.  
  131.